package com.my.basic.classes;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author marshal
 * @version 2021-06-02
 * <p>
 * 关于hashCode()和equals()的一些约定：
 * <p>
 * 1. 重写equals方法必须遵循自反性、对称性、传递性、一致性
 * 2. 重写equals方法时必须重写hashCode方法
 * 3. 如果自定义对象作为Map的key或者作为Set存储的对象时，就必须重写equals和hashCode方法
 */
public class HashCodeTest {

    public static void main(String[] args) {
        Map<Sub, String> map = new HashMap<>();
        var s1 = new Sub(10, "ten");
        map.put(s1, "10ten");
        // 不重写hashCode方法，则返回null，重写hashCode方法，则返回10ten
        var s2 = new Sub(10, "ten");
        System.out.println(map.get(s2));

        // false
        System.out.println(s1 == s2);
        // true
        System.out.println(Objects.equals(s1, s2));
    }

    static class Sub {
        private int f1;
        private String f2;

        public Sub(int f1, String f2) {
            this.f1 = f1;
            this.f2 = f2;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Sub sub = (Sub) o;
            return f1 == sub.f1 && Objects.equals(f2, sub.f2);
        }

        @Override
        public int hashCode() {
            return Objects.hash(f1, f2);
        }
    }
}
